﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Entidades.Basicas;
using TCC_Hotel.Serviços;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.Funcionarios
{
    public partial class EditarFuncionario : System.Web.UI.Page
    {
        WebServices servicos = new WebServices();
        GeralServices geral = null;
        FuncionarioService servico = new FuncionarioService();
        string CPF = null;

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Funcionarios)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            //Se nao vier parametro, redireciona o usuario para a tela inicial
            if (Request.Params["cpf"] == null)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                geral = new GeralServices();
                //popular o dropdown estados
                ddlEstado.DataSource = geral.GetEstados();
                ddlEstado.DataTextField = "nome";
                ddlEstado.DataValueField = "sigla";
                ddlEstado.DataBind();

                //São Paulo será o estado default
                ddlEstado.SelectedValue = "SP";

                //popular o dropdown cargos

                ddlCargo.DataSource = geral.GetCargos();
                ddlCargo.DataBind();


                //Recupera o parametro da URL
                 CPF = Request.Params["cpf"];

                FuncionarioService servico = new FuncionarioService();

                //chama o serviço que busca no banco de dados o funcionario correspondente
                Funcionario funcionario = servico.RecuperarDetalhesFuncionario(CPF);

                //Monta o formulario para o usuario
                if (funcionario != null)
                {
                    txtNome.Text = funcionario.Nome;
                    txtNascimento.Text = Convert.ToString(funcionario.Nascimento).Substring(0, 10);
                    

                    //Verifica se é não null para não gerar exceção
                    if (!String.IsNullOrEmpty(funcionario.Contato.Telefone[0]))
                    {
                        txtDDDTelefone1.Text = funcionario.Contato.Telefone[0].Substring(0, 2);
                        txtTelefone1.Text = funcionario.Contato.Telefone[0].Substring(2);
                    }

                    //Verifica se é não null para não gerar exceção
                    if (!String.IsNullOrEmpty(funcionario.Contato.Telefone[1]))
                    {
                        txtDDDTelefone2.Text = funcionario.Contato.Telefone[1].Substring(0, 2);
                        txtTelefone2.Text = funcionario.Contato.Telefone[1].Substring(2);
                    }

                    //Verifica se é não null para não gerar exceção
                    if (!String.IsNullOrEmpty(funcionario.Contato.Celular[1]))
                    {
                        txtDDDCelular2.Text = funcionario.Contato.Celular[1].Substring(0, 2);
                        txtCelular2.Text = funcionario.Contato.Celular[1].Substring(2);
                    }

                    //Verifica se é não null para não gerar exceção
                    if (!String.IsNullOrEmpty(funcionario.Contato.Celular[0]))
                    {
                        txtDDDCelular1.Text = funcionario.Contato.Celular[0].Substring(0, 2);
                        txtCelular1.Text = funcionario.Contato.Celular[0].Substring(2);
                    }

                    txtEmail.Text = funcionario.Contato.Email;
                    txtLogradouro.Text = funcionario.Endereco.Logradouro;
                    txtBairro.Text = funcionario.Endereco.Bairro;
                    txtCEP.Text = funcionario.Endereco.CEP;
                    txtNumero.Text = Convert.ToString(funcionario.Endereco.Numero);
                    txtCidade.Text = funcionario.Endereco.Cidade;
                    ddlEstado.SelectedValue = funcionario.Endereco.Estado.sigla;
                    txtComplemento.Text = funcionario.Endereco.Complemento;
                    txtCPF.Text = funcionario.CPF;
                    txtRG.Text = funcionario.RG;
                    txtPIS.Text = funcionario.PIS;
                    txtCarteiraTrabalho.Text = funcionario.CarteiraTrabalho;
                    txtAgencia.Text = funcionario.Agencia;
                    txtConta.Text = funcionario.Conta_Corrente;
                    txtBanco.Text = funcionario.Banco;
                    txtAdmissao.Text = Convert.ToString(funcionario.Data_Admissao).Substring(0, 10);
                    txtSalario.Text = string.Format("{0:0.00}", funcionario.Salario);
                    ddlCargo.SelectedValue = funcionario.Cargo;
                    ckbAtivo.Checked = funcionario.Ativo;
                    Session["RG"] = funcionario.RG;

                    if (!funcionario.Ativo)
                    {
                        txtDemissao.Text = Convert.ToString(funcionario.Data_Demissao).Substring(0, 10);
                    }
                    else
                    {
                        ckbAtivo.Enabled = false;
                        txtDemissao.Text = "Ativo";
                    }


                }
            }
        }

        /// <summary>
        /// Evento de click do botão salvar usado para salvar um funcionário
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            //Recupera o parametro da URL
            CPF = Request.Params["cpf"];
            string RGAtual = servico.RecuperarDetalhesFuncionario(CPF).RG;
          

            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios fora preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome.Text.Trim(),
                txtNascimento.Text,
                txtLogradouro.Text.Trim(),
                txtBairro.Text.Trim(),
                txtCEP.Text,
                txtCidade.Text.Trim(),
                txtNumero.Text,
                txtCPF.Text,
                txtRG.Text,
                txtAdmissao.Text,
                txtSalario.Text,
                txtCarteiraTrabalho.Text,
                txtPIS.Text
            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
          
            //faz a validação das datas         
            if (!comum.ValidaData(txtNascimento.Text) || !comum.ValidaData(txtAdmissao.Text))
            {
                MensagemJS("ERRO: Data(s) inválida(s)");
                return;
            }


            //Faz validação do RG
            if (!comum.ValidaRG(txtRG.Text))
            {
                MensagemJS("ERRO: RG digitado não é válido");
                return;
            }

            //Verifica se o RG ja esta cadastrado
            if (!servico.VerificarRGCadastrado(txtRG.Text, RGAtual))
            {
                MensagemJS("ERRO: RG já cadastrado!");
                return;
            }

            //Faz validação do CPF
            if (!comum.ValidaCPF(txtCPF.Text))
            {
                MensagemJS("ERRO: CPF digitado não é válido");
                return;
            }

            //Faz validação do PIS
            if (!servico.ValidaPIS(txtPIS.Text))
            {
                MensagemJS("ERRO: PIS digitado não é válido");
                return;
            }

            //Faz validação dos telefones
            List<string> DDDs = new List<string>();
            List<string> Telefones = new List<string>();

            Telefones.Add(txtCelular1.Text);
            Telefones.Add(txtCelular2.Text);
            Telefones.Add(txtTelefone1.Text);
            Telefones.Add(txtTelefone2.Text);

            DDDs.Add(txtDDDCelular1.Text);
            DDDs.Add(txtDDDCelular2.Text);
            DDDs.Add(txtDDDTelefone1.Text);
            DDDs.Add(txtDDDTelefone2.Text);


            if (!comum.ValidaTelefones(DDDs, Telefones))
            {
                MensagemJS("ERRO: Telefones digitados não são válidos");
                return;
            }

            //monta o objeto funcionario
            try
            {
                Funcionario funcionario = new Funcionario()
                {
                    Nome = txtNome.Text.Trim(),
                    Nascimento = Convert.ToDateTime(txtNascimento.Text),
                    Contato = new Contato()
                    {

                        Celular = new List<string>() { (txtDDDCelular1.Text + txtCelular1.Text), (txtDDDCelular2.Text + txtCelular2.Text) },
                        Telefone = new List<string>() { (txtDDDTelefone1.Text + txtTelefone1.Text), (txtDDDTelefone2.Text + txtTelefone2.Text) },
                        Email = txtEmail.Text

                    },
                    Endereco = new Endereco()
                    {
                        Logradouro = txtLogradouro.Text.Trim(),
                        Bairro = txtBairro.Text.Trim(),
                        CEP = txtCEP.Text,
                        Cidade = txtCidade.Text.Trim(),
                        Complemento = txtComplemento.Text.Trim(),
                        Estado = new Estado() { nome = ddlEstado.SelectedItem.Text, sigla = ddlEstado.SelectedValue },
                        Numero = Convert.ToInt32(txtNumero.Text)
                    },

                    CPF = txtCPF.Text,
                    RG = txtRG.Text,
                    CarteiraTrabalho = txtCarteiraTrabalho.Text,
                    Agencia = txtAgencia.Text,
                    Ativo = ckbAtivo.Checked,
                    Banco = txtBanco.Text,
                    Conta_Corrente = txtConta.Text,
                    Data_Admissao = Convert.ToDateTime(txtAdmissao.Text),
                    Data_Demissao = txtDemissao.Text != "Ativo" ? Convert.ToDateTime(txtDemissao.Text) : Convert.ToDateTime(txtAdmissao.Text),
                    PIS = txtPIS.Text,
                    Salario = Convert.ToDouble(txtSalario.Text),
                    Cargo = ddlCargo.SelectedValue

                };


                //chama o serviço que insere o funcionário no banco de dados
                if (servico.EditarFuncionario(CPF, funcionario))
                {
                    MensagemJS("Funcionário editado com sucesso!");
                    HttpContext.Current.Cache.Remove("Lista_Funcionario");
                }
                else
                {
                    MensagemJS("ERRO: Funcionário com esse CPF já existente");
                    return;
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
               return;

            }

        }

        /// <summary>
        /// Evento de click do botão limpar usado para limpar todos os textBox
        /// </summary>
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome.Text = null;
            txtNascimento.Text = null;
            txtDDDCelular1.Text = null;
            txtDDDCelular2.Text = null;
            txtDDDTelefone1.Text = null;
            txtDDDTelefone2.Text = null;
            txtCelular1.Text = null;
            txtTelefone1.Text = null;
            txtCelular2.Text = null;
            txtEmail.Text = null;
            txtTelefone2.Text = null;
            txtLogradouro.Text = null;
            txtBairro.Text = null;
            txtComplemento.Text = null;
            txtCEP.Text = null;
            txtCidade.Text = null;
            txtNumero.Text = null;
            txtCPF.Text = null;
            txtRG.Text = null;
            txtAgencia.Text = null;
            txtConta.Text = null;
            txtAdmissao.Text = null;
            txtSalario.Text = null;
            txtPIS.Text = null;
            txtCarteiraTrabalho.Text = null;
            txtBanco.Text = null;
        }
        

        protected void btnBuscaCEP_Click(object sender, EventArgs e)
        {
            //Chama o serviço que faz essa busca
            Endereco endereco = servicos.GetEnderecoPorCEP(txtCEP.Text);

            //Preenche os textbox com o endereço correspondente
            txtBairro.Text = endereco.Bairro;
            txtLogradouro.Text = endereco.Logradouro;
            txtCidade.Text = endereco.Cidade;

            if (!String.IsNullOrEmpty(endereco.Estado.sigla))
                ddlEstado.SelectedValue = endereco.Estado.sigla;
        }

        /// <summary>
        /// Evento de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {      
            //Redireciona para a pagina anterior
            Response.Redirect("~/Apresentacao/Funcionarios/ListarFuncionarios.aspx");        
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "Mensagem",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }
        
    }
}